/**
 * @param {string[]} strs
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var findMaxForm = function (strs, m, n) {
    // dp[i][j]表示当前条件下允许的子集最大个数
    const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0))
    dp[0][0] = 0

    for (let ch of strs) {
        // 计算每个字符串0和1个数
        const zero = ch.match(/[0]/g) ? ch.match(/[0]/g).length : 0
        const one = ch.length - zero

        for (i = m; i >= zero; i--) {
            for (j = n; j >= one; j--) {
                // 自顶向下
                dp[i][j] = Math.max(dp[i][j], dp[i - zero][j - one] + 1)
            }
        }
    }

    return dp[m][n]
};